using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._UtilityNetworkTools
{
    /// <summary>
    /// <para>Add Trace Rule</para>
    /// <para>Add a trace rule to a diagram template</para>
    /// <para>向逻辑示意图模板添加跟踪规则</para>
    /// </summary>    
    [DisplayName("Add Trace Rule")]
    public class AddTraceRule : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public AddTraceRule()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_utility_network">
        /// <para>Input Network</para>
        /// <para></para>
        /// <para></para>
        /// </param>
        /// <param name="_template_name">
        /// <para>Input Diagram Template</para>
        /// <para></para>
        /// <para></para>
        /// </param>
        /// <param name="_is_active">
        /// <para>Active</para>
        /// <para></para>
        /// <para></para>
        /// </param>
        /// <param name="_trace_type">
        /// <para>Trace Type</para>
        /// <para></para>
        /// <para></para>
        /// </param>
        public AddTraceRule(object _in_utility_network, object _template_name, _is_active_value _is_active, object _trace_type)
        {
            this._in_utility_network = _in_utility_network;
            this._template_name = _template_name;
            this._is_active = _is_active;
            this._trace_type = _trace_type;
        }
        public override string ToolboxName => "Utility Network Tools";

        public override string ToolName => "Add Trace Rule";

        public override string CallName => "un.AddTraceRule";

        public override List<string> AcceptEnvironments => [];

        public override object[] ParameterInfo => [_in_utility_network, _template_name, _is_active.GetGPValue(), _trace_type, _domain_network, _tier, _target_tier, _include_structures.GetGPValue(), _include_barriers.GetGPValue(), _condition_barriers, _function_barriers, _traversability_scope.GetGPValue(), _filter_barriers, _filter_function_barriers, _filter_scope.GetGPValue(), _filter_bitset_network_attribute_name, _filter_nearest.GetGPValue(), _nearest_count, _nearest_cost_network_attribute, _nearest_categories, _nearest_assets, _propagators, _description, _out_utility_network, _out_template_name, _allow_indeterminate_flow.GetGPValue(), _path_direction.GetGPValue(), _path_network_weight_name];

        /// <summary>
        /// <para>Input Network</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Network")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_utility_network { get; set; }


        /// <summary>
        /// <para>Input Diagram Template</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Diagram Template")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _template_name { get; set; }


        /// <summary>
        /// <para>Active</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Active")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _is_active_value _is_active { get; set; }

        public enum _is_active_value
        {
            /// <summary>
            /// <para>ACTIVE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("ACTIVE")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>INACTIVE</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("INACTIVE")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Trace Type</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Trace Type")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _trace_type { get; set; }


        /// <summary>
        /// <para>Domain Network</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Domain Network")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _domain_network { get; set; } = null;


        /// <summary>
        /// <para>Tier</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Tier")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _tier { get; set; } = null;


        /// <summary>
        /// <para>Target Tier</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Target Tier")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _target_tier { get; set; } = null;


        /// <summary>
        /// <para>Include Structures</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Include Structures")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _include_structures_value _include_structures { get; set; } = _include_structures_value._false;

        public enum _include_structures_value
        {
            /// <summary>
            /// <para>INCLUDE_STRUCTURES</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("INCLUDE_STRUCTURES")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>EXCLUDE_STRUCTURES</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("EXCLUDE_STRUCTURES")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Include Barrier Features</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Include Barrier Features")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _include_barriers_value _include_barriers { get; set; } = _include_barriers_value._true;

        public enum _include_barriers_value
        {
            /// <summary>
            /// <para>INCLUDE_BARRIERS</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("INCLUDE_BARRIERS")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>EXCLUDE_BARRIERS</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("EXCLUDE_BARRIERS")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Condition Barriers</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Condition Barriers")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _condition_barriers { get; set; } = null;


        /// <summary>
        /// <para>Function Barriers</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Function Barriers")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _function_barriers { get; set; } = null;


        /// <summary>
        /// <para>Apply Traversability To</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Apply Traversability To")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _traversability_scope_value _traversability_scope { get; set; } = _traversability_scope_value._BOTH_JUNCTIONS_AND_EDGES;

        public enum _traversability_scope_value
        {
            /// <summary>
            /// <para>BOTH_JUNCTIONS_AND_EDGES</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("BOTH_JUNCTIONS_AND_EDGES")]
            [GPEnumValue("BOTH_JUNCTIONS_AND_EDGES")]
            _BOTH_JUNCTIONS_AND_EDGES,

            /// <summary>
            /// <para>JUNCTIONS_ONLY</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("JUNCTIONS_ONLY")]
            [GPEnumValue("JUNCTIONS_ONLY")]
            _JUNCTIONS_ONLY,

            /// <summary>
            /// <para>EDGES_ONLY</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("EDGES_ONLY")]
            [GPEnumValue("EDGES_ONLY")]
            _EDGES_ONLY,

        }

        /// <summary>
        /// <para>Filter Barriers</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Filter Barriers")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _filter_barriers { get; set; } = null;


        /// <summary>
        /// <para>Filter Function Barriers</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Filter Function Barriers")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _filter_function_barriers { get; set; } = null;


        /// <summary>
        /// <para>Apply Filter To</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Apply Filter To")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _filter_scope_value _filter_scope { get; set; } = _filter_scope_value._BOTH_JUNCTIONS_AND_EDGES;

        public enum _filter_scope_value
        {
            /// <summary>
            /// <para>BOTH_JUNCTIONS_AND_EDGES</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("BOTH_JUNCTIONS_AND_EDGES")]
            [GPEnumValue("BOTH_JUNCTIONS_AND_EDGES")]
            _BOTH_JUNCTIONS_AND_EDGES,

            /// <summary>
            /// <para>JUNCTIONS_ONLY</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("JUNCTIONS_ONLY")]
            [GPEnumValue("JUNCTIONS_ONLY")]
            _JUNCTIONS_ONLY,

            /// <summary>
            /// <para>EDGES_ONLY</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("EDGES_ONLY")]
            [GPEnumValue("EDGES_ONLY")]
            _EDGES_ONLY,

        }

        /// <summary>
        /// <para>Filter by bitset network attribute</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Filter by bitset network attribute")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _filter_bitset_network_attribute_name { get; set; } = null;


        /// <summary>
        /// <para>Filter by nearest</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Filter by nearest")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _filter_nearest_value _filter_nearest { get; set; } = _filter_nearest_value._false;

        public enum _filter_nearest_value
        {
            /// <summary>
            /// <para>FILTER_BY_NEAREST</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("FILTER_BY_NEAREST")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>DO_NOT_FILTER</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("DO_NOT_FILTER")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Count</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Count")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public long? _nearest_count { get; set; } = null;


        /// <summary>
        /// <para>Cost Network Attribute</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Cost Network Attribute")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _nearest_cost_network_attribute { get; set; } = null;


        /// <summary>
        /// <para>Nearest Categories</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Nearest Categories")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _nearest_categories { get; set; } = null;


        /// <summary>
        /// <para>Nearest Asset Groups/Types</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Nearest Asset Groups/Types")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _nearest_assets { get; set; } = null;


        /// <summary>
        /// <para>Propagators</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Propagators")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _propagators { get; set; } = null;


        /// <summary>
        /// <para>Description</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Description")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _description { get; set; } = null;


        /// <summary>
        /// <para>Output Network</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Network")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _out_utility_network { get; set; }


        /// <summary>
        /// <para>Output Diagram Template</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Diagram Template")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _out_template_name { get; set; }


        /// <summary>
        /// <para>Allow Indeterminate Flow</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Allow Indeterminate Flow")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _allow_indeterminate_flow_value _allow_indeterminate_flow { get; set; } = _allow_indeterminate_flow_value._false;

        public enum _allow_indeterminate_flow_value
        {
            /// <summary>
            /// <para>TRACE_INDETERMINATE_FLOW</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("TRACE_INDETERMINATE_FLOW")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>IGNORE_INDETERMINATE_FLOW</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("IGNORE_INDETERMINATE_FLOW")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Path Direction</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Path Direction")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _path_direction_value _path_direction { get; set; } = _path_direction_value._NO_DIRECTION;

        public enum _path_direction_value
        {
            /// <summary>
            /// <para>NO_DIRECTION</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_DIRECTION")]
            [GPEnumValue("NO_DIRECTION")]
            _NO_DIRECTION,

            /// <summary>
            /// <para>PATH_UPSTREAM</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("PATH_UPSTREAM")]
            [GPEnumValue("PATH_UPSTREAM")]
            _PATH_UPSTREAM,

            /// <summary>
            /// <para>PATH_DOWNSTREAM</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("PATH_DOWNSTREAM")]
            [GPEnumValue("PATH_DOWNSTREAM")]
            _PATH_DOWNSTREAM,

        }

        /// <summary>
        /// <para>Shortest Path Network Attribute Name</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Shortest Path Network Attribute Name")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _path_network_weight_name { get; set; } = null;


        public AddTraceRule SetEnv()
        {
            base.SetEnv();
            return this;
        }

    }

}